package com.nowcoder.community.c2_quartz;

import com.nowcoder.community.a_entity.DiscussPost;
import com.nowcoder.community.c_service.DiscussPostService;
import com.nowcoder.community.c_service.LikeService;
import com.nowcoder.community.z_util.CommunityConstant;
import com.nowcoder.community.z_util.RedisKeyUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
 * <p>      独立定时器 最终目的调用Servcie存数据库
 * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
 */
public class PostScoreRefreshJob implements Job,CommunityConstant {

    //一写psf就忘对象名！！！
    public static final Logger logger = LoggerFactory.getLogger(PostScoreRefreshJob.class);

    // 牛客纪元
    private static final Date epoch;
    static {
        try {
            epoch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-08-01 00:00:00");
        } catch (ParseException e) {
            throw new RuntimeException("初始化牛客纪元失败!", e);
        }
    }

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private DiscussPostService discussPostService;
    @Autowired
    private LikeService likeService;//like只要对帖子的、而且like太杂要用type区分【图化背】


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.info("\n\n" +"30秒了，qzJob_exec执行一次了刷新热帖！！\n");
        String redisKey = RedisKeyUtil.getPostScoreKey();
        BoundSetOperations operations = redisTemplate.boundSetOps(redisKey);

        while (operations.size() > 0) {
            int postId = Integer.parseInt(operations.pop().toString());
            DiscussPost post = discussPostService.findPostById(postId);
            // 计算权重
            double w = (post.getStatus()==1 ? 75 : 0) + post.getCommentCount() * 10 + likeService.findEntityLikeCount(ENTITY_TYPE_POST,postId) * 2;
            // 分数 = 帖子权重 + 距离天数
            double score = Math.log10(Math.max(w, 1))
                    + (post.getCreateTime().getTime() - epoch.getTime()) / (1000 * 3600 * 24);
            // 更新帖子分数
            discussPostService.updateScore(postId, score);
        }

    }
}
